package com.lsa.letcode.the75.sortColors;

import static org.junit.Assert.*;

import java.util.Arrays;

import org.junit.Test;

import com.lsa.helpers.Utils;

public class SortColorsTest {
	@Test
	public void test() throws Exception {
		test(Utils.createIntArray1D("0 0 0 0"),
				Utils.createIntArray1D("0 0 0 0"));
		
		test(Utils.createIntArray1D("0"),
				Utils.createIntArray1D("0"));
		
		test(Utils.createIntArray1D("1 1 1 1"),
				Utils.createIntArray1D("1 1 1 1"));
		
		test(Utils.createIntArray1D("1"),
				Utils.createIntArray1D("1"));
		
		test(Utils.createIntArray1D("2 2 2 2"),
				Utils.createIntArray1D("2 2 2 2"));
		
		test(Utils.createIntArray1D("2"),
				Utils.createIntArray1D("2"));
		
		test(Utils.createIntArray1D("2 2 2 0 0 0 1 1 0"),
				Utils.createIntArray1D("0 0 0 0 1 1 2 2 2"));
		
		test(Utils.createIntArray1D("2 2 2 0 1 0 1 0 0 0 2 2 2 1 1 0 2"),
				Utils.createIntArray1D("0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2"));
		
		test(Utils.createIntArray1D("0 0 0 1 1 0"),
				Utils.createIntArray1D("0 0 0 0 1 1"));
		
		test(Utils.createIntArray1D("2 0 0 0 1 1 0"),
				Utils.createIntArray1D("0 0 0 0 1 1 2"));
		
		test(Utils.createIntArray1D("2 0 0 2 0 1 1 0 2 2"),
				Utils.createIntArray1D("0 0 0 0 1 1 2 2 2 2"));
		
		test(Utils.createIntArray1D("1 1 2 2"),
				Utils.createIntArray1D("1 1 2 2"));
		
		test(Utils.createIntArray1D("1 1 1 2 2"),
				Utils.createIntArray1D("1 1 1 2 2"));
		
		test(Utils.createIntArray1D("0 1 2 0 1 2 0 1 2"),
				Utils.createIntArray1D("0 0 0 1 1 1 2 2 2"));
		
		test(Utils.createIntArray1D("0 1 2 0 1 0 2 1 2"),
				Utils.createIntArray1D("0 0 0 1 1 1 2 2 2"));
		
		testByPermutations(Utils.createIntArray1D("0 0 0 0 0 1 1 1 2 2"));
		testByPermutations(Utils.createIntArray1D("0 0 1"));
		testByPermutations(Utils.createIntArray1D("0 0 1 2"));
		testByPermutations(Utils.createIntArray1D("0 0 1 1 2 2"));
	}

	private void testByPermutations(int[] sortedArray) {
		com.lsa.letcode.the31.permutation.Solution s = new com.lsa.letcode.the31.permutation.Solution();
		int[] c = sortedArray;
		int[] first = Arrays.copyOf(sortedArray, c.length);
		do{
			test(Arrays.copyOf(c, c.length),
					first);
			s.nextPermutation(c);
		}
		while(!Arrays.equals(first, c));
	}

	private void test(int[] input, int[] expected) {
		Solution s = new Solution();
		s.sortColors(input);
		assertArrayEquals(input, expected);
	}
}
